import wtforms
from wtforms.validators import Length, Regexp
from models import Teacher, Student
import re


class LoginForm(wtforms.Form):
    ID = wtforms.StringField(validators=[
        Length(min=4, max=20, message="账号长度应在4-20位之间"),
        Regexp(r'^[a-zA-Z0-9_]+$', message="账号只能包含字母、数字和下划线")
    ])
    password = wtforms.StringField(validators=[
        Length(min=6, max=50, message="密码长度应在6-50位之间")
    ])

    # 注意：在实际登录时不应该提前验证用户是否存在，这会泄露系统用户信息
    # 这里保留是为了兼容性，但在实际安全实现中应该移除
    def validate_id(self, field):
        ID = field.data
        # 防止SQL注入，进行基本的输入清理
        if not re.match(r'^[a-zA-Z0-9_]+$', ID):
            raise wtforms.ValidationError(message="账号格式不正确")
        
        # 注释掉用户存在性验证，在登录时统一处理
        # 这样可以防止用户枚举攻击
        # try:
        #     user1 = Teacher.query.filter_by(ID=ID).first()
        #     user2 = Student.query.filter_by(ID=ID).first()
        #     if user1 is None and user2 is None:
        #         raise wtforms.ValidationError(message="用户不存在")
        # except Exception as e:
        #     raise wtforms.ValidationError(message="验证用户时发生错误")
            
    def validate_password(self, field):
        password = field.data
        # 基本的密码安全检查
        if len(password) < 6:
            raise wtforms.ValidationError(message="密码至少需要6个字符")
        if len(password) > 50:
            raise wtforms.ValidationError(message="密码不能超过50个字符")
        # 可以添加更多密码复杂度要求
        # if not re.search(r'[A-Za-z]', password) or not re.search(r'\d', password):
        #     raise wtforms.ValidationError(message="密码应包含字母和数字")
